﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace iNet.Media.Video
{
	/// <summary>
	/// IsoBaseVideoDecodeTask 工廠基底類別。
	/// </summary>
	public abstract class IsoBaseVideoDecodeTaskFactory : FastVideoDecodeTaskFactory
	{
		#region 欄位
		readonly uint[] _MajorBrands;
		#endregion
		#region 建構子
		/// <summary>
		/// 初始化新的 IsoBaseVideoDecodeTaskFactory 執行個體。
		/// </summary>
		/// <param name="name">解碼工作工廠名稱。</param>
		/// <param name="decodingFormat">支援解碼的影音容器格式。</param>
		/// <param name="majorBrand">儲存於 ftyp Box 的 Major brand。</param>
		protected IsoBaseVideoDecodeTaskFactory(string name, IMediaFormat decodingFormat, uint majorBrand)
			: this(name, decodingFormat, new uint[] { majorBrand })
		{ }
		/// <summary>
		/// 初始化新的 IsoBaseVideoDecodeTaskFactory 執行個體。
		/// </summary>
		/// <param name="name">解碼工作工廠名稱。</param>
		/// <param name="decodingFormat">支援解碼的影音容器格式。</param>
		/// <param name="majorBrands">所有可能儲存於 ftyp Box 的 Major brand。</param>
		protected IsoBaseVideoDecodeTaskFactory(string name, IMediaFormat decodingFormat, uint[] majorBrands)
			: base(name, decodingFormat)
		{
			_MajorBrands = majorBrands;
		}
		#endregion
		#region IsSupportedFormatCore
		/// <summary>
		/// 確認指定的媒體標頭是否符合支援的媒體格式。
		/// </summary>
		/// <param name="mediaHeader">媒體標頭。</param>
		/// <returns>True 表示媒體標頭符合支援的媒體格式，False 表示不符合。</returns>
		protected override bool IsSupportedFormatCore(byte[] mediaHeader)
		{
			if (mediaHeader.Length < 12)
				return false;
			if (BitConverter.BigEndian.ToUInt32(mediaHeader, 4) != 0x66747970u)
				return false;
			if (_MajorBrands.Length > 0)
			{
				uint majorBrand = BitConverter.BigEndian.ToUInt32(mediaHeader, 8);
				for (int i = _MajorBrands.Length - 1; i >= 0; --i)
				{
					if (majorBrand == _MajorBrands[i])
						return true;
				}
			}
			return false;
		}
		#endregion
		#region MediaHeaderSize
		/// <summary>
		/// 取得媒體標頭的位元組大小。
		/// </summary>
		public override int MediaHeaderSize
		{
			get
			{
				return 12;
			}
		}
		#endregion
	}
}
